package prog2012.practico2.arboles;

public class TArbolBB implements IArbolBB {

	private IElementoAB raiz;
	
	public TArbolBB (){
		super();
		raiz=null;
	}
	
	@Override
	public IElementoAB obtenerRaiz() {
		return raiz;
	}

	@Override
	public boolean esVacio() {
		return raiz == null;
	}

	@Override
	public boolean vaciar() {
		raiz = null;
		return true;
	}

	@Override
	public boolean insertar(IElementoAB elemento) {
		if (elemento != null){
			if (esVacio()){
				raiz=elemento;
				return true;
			}else{
				return raiz.insertar(elemento);
			}
		}
		return false;
	}

	@Override
	public IElementoAB buscar(Comparable unaEtiqueta) {
		IElementoAB aDevolver = null;
		if (esVacio()){
			return aDevolver;
		}else{
			return raiz.buscar(unaEtiqueta);
		}
	}

	@Override
	public String inOrden() {
		String aDevolver = null;
		if (esVacio()){
			return aDevolver;
		}else{
			return raiz.inOrden();
		}
	}

	@Override
	public String preOrden() {
		String aDevolver = null;
		if (esVacio()){
			return aDevolver;
		}else{
			return raiz.preOrden();
		}
	}

	@Override
	public String postOrden() {
		String aDevolver = null;
		if (esVacio()){
			return aDevolver;
		}else{
			return raiz.postOrden();
		}
	}

	@Override
	public boolean eliminar(Comparable etiquetaAEliminar) {
		if (etiquetaAEliminar != null){
			if (raiz != null){ 
				if (raiz.getEtiqueta().compareTo(etiquetaAEliminar)!= 0 ){
					return raiz.buscaParaQuitar(etiquetaAEliminar);
				}else{
					raiz = raiz.quitar();
					return true;
				}
			}
		}
		return false;
	}

	@Override
	public int obtenerCantidadElementos() {
		int aDevolver = 0;
		if (esVacio()){
			return aDevolver;
		}else{
			return raiz.obtenerCantidadElementos();
		}
	}

	@Override
	public Comparable encontrarMinimo() {
		Comparable aDevolver = null;
		if (esVacio()){
			return aDevolver;
		}else{
			return raiz.encontrarMinimo();
		}
	}

	@Override
	public Comparable encontrarMaximo() {
		Comparable aDevolver = null;
		if (esVacio()){
			return aDevolver;
		}else{
			return raiz.encontrarMaximo();
		}
	}

	@Override
	public int obtenerNivel(Comparable unaEtiqueta) {
		int nivel= 0;
		if (esVacio()){
			return nivel;
		}else{
			return raiz.obtenerNivel(unaEtiqueta,nivel);
		}
	}


	@Override
    public int obtenerAltura() {
        int altura= 0;
        if (esVacio()){
            return altura;
        }else{
            return raiz.obtenerAltura();
        }
    }


	@Override
	public IElementoAB obtenerPadre(Comparable unaEtiqueta) {
		if (!esVacio()){ 
			if(unaEtiqueta!=null){    
				IElementoAB hijo = null;    
				if (this.obtenerRaiz().getEtiqueta().compareTo(unaEtiqueta) == 0){
					return null;
				}
				if (this.obtenerRaiz().getEtiqueta().compareTo(unaEtiqueta) > 0 && this.obtenerRaiz().getHijoIzq() != null){
					TElementoAB hijoIzquierdoT = (TElementoAB)this.obtenerRaiz().getHijoIzq();
					if(hijoIzquierdoT.getEtiqueta().compareTo(unaEtiqueta)==0){
						return this.obtenerRaiz();
					}
					hijo= hijoIzquierdoT.obtenerPadre(unaEtiqueta);                    
				}
				if (this.obtenerRaiz().getEtiqueta().compareTo(unaEtiqueta) < 0 && this.obtenerRaiz().getHijoDer() != null){
					TElementoAB hijoDerechoT = (TElementoAB)this.obtenerRaiz().getHijoDer();
					if(hijoDerechoT.getEtiqueta().compareTo(unaEtiqueta)==0){
						return this.obtenerRaiz();
					}
					hijo=hijoDerechoT.obtenerPadre(unaEtiqueta);
				}
				return hijo;                
			}
		}return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public boolean esEquivalente(IArbolBB otroArbol) {
		IElementoAB elementoA1 = raiz;
		IElementoAB elementoA2 = otroArbol.obtenerRaiz();
		if (elementoA1.getEtiqueta().compareTo(elementoA2.getEtiqueta()) == 0){
			return elementoA1.equivalentes(elementoA2);
		}else{
			return false;
		}
	}

}
